const ObjectId = require('mongoose').Types.ObjectId
const { stateKeys } = require('./model')

class BaseMongo {
	constructor () {

	}

	/**
	 * 根据键值获取json数据
	 * @param obj 需要获取数据独享
	 * @param {[String]} keys 键值数组
	 */
	static getJson(obj, keys) {
		const json = {}
		keys.forEach((key) => {
			if (typeof key == 'string') {
				json[key] = obj[key]
			} else {
				json[key[1]] = obj[0]
			}
		})
		return json
	}

	/**
	 * 添加存在的对象
	 * @param {[String]} keys 键值数组
	 */
	static existparameter(keys) {
		const json = {}
		keys.forEach((key) => {
			json[key] = 1
		})
		return json
	}

	/**
	 * ID对象封装
	 * @param {String} id ID
	 * @returns {*}
	 */
	static objId (id) {
		return ObjectId(id)
	}

	/**
	 * 获取参数
	 * @param { String | Object } conditions 查询条件ID 或者自定义参数
	 * @returns {*}
	 */
	static getConditions(conditions = {}) {
		return conditions instanceof Object ? conditions : {'_id': this.objId(conditions)}
	}

	/**
	 * 获取单个数据详情
	 * @param { String | Object } conditions 查询条件ID 或者自定义参数
	 * @param  { Object } other 其他参数
	 * @returns {Promise<*>}
	 */
	static findOne(conditions, other) {
		return this.model.findOne(this.getConditions(conditions), other)
	}

	/**
	 * 删除一个数据
	 * @param conditions 删除的参数
	 * @param thorough 是否彻底的删除数据
	 * @returns {*}
	 */
	static deleteOne(conditions, thorough = false) {
		if (thorough) {
			return this.model.deleteOne(this.getConditions(conditions))
		} else {
			return this.model.updateOne(this.getConditions(conditions), {
				stateKey: stateKeys.DELETE
			})
		}
	}

	/**
	 * 添加到回收站
	 * @param id 数据ID
	 * @returns {*}
	 */
	static dustbin_push(id) {
		return this.model.updateOne({_id: this.objId(id)}, {
			stateKey: stateKeys.DUSTBIN
		})
	}

	/**
	 * 从回收站还原
	 * @param id
	 * @returns {*}
	 */
	static dustbin_pop(id) {
		return this.model.updateOne({_id: this.objId(id)}, {
			stateKey: stateKeys.NORMAL
		})
	}

	/**
	 * 获取字段数组
	 * @param data 更新、添加的数据
	 * @param keyData 键值数据
	 * 	- undefined: 默认获取 this.getJson(data, this.fieldArr)
	 * 	- Array: this.getJson(data, keyData)
	 */
	static getFiledData(data, keyData) {
		return this.getJson(data, keyData instanceof Array ? keyData : this.fieldArr)
	}

	/**
	 * 修改数据
	 * @param data 接口传过来的数据
	 * @param keyData 更新的参数数组
	 * @returns {*}
	 */
	static updateOneWithId(data, keyData) {
		return this.model.updateOne({_id: this.objId(data.id)}, this.getFiledData(data, keyData))
	}

	/**
	 * 修改数据
	 * @param search 查询的数据
	 * @param data 接口传过来的数据
	 * @param keyData 更新的参数数组
	 * @returns {*}
	 */
	static updateOne(search, data, keyData) {
		return this.model.updateOne(search, this.getFiledData(data, keyData))
	}

	/**
	 * 添加数据
	 * @param data banner数据
	 * @returns {Promise<void>}
	 */
	static add(data, keyData) {
		return new this.model(this.getFiledData(data, keyData)).save()
	}

	/**
	 * 获取所回收站数据
	 * @returns {Promise<void>}
	 */
	static findDustbin() {
		return this.model.find({stateKey: stateKeys.DUSTBIN})
	}

	/**
	 * 获取总个数
	 * @param {Object} 参数
	 * @returns {*}
	 */
	/**
	 *
	 * @param p
	 * @returns {*}
	 */
	static count(p = {}) {
		return this.model.countDocuments(p)
	}
}

/**
 * 当前数据模型
 * @type {null}
 */
BaseMongo.model = null
/**
 * 添加字段数组
 * @type {Array}
 */
BaseMongo.fieldArr = []

module.exports = BaseMongo
